package com.bdf.ipharma.model;

import java.awt.Component;
import java.util.List;

import javax.swing.table.AbstractTableModel;
import javax.swing.table.TableModel;

import org.springframework.context.ApplicationContext;

import com.bdf.ipharma.ApplicationContextProvider;
import com.bdf.ipharma.config.Session;
import com.bdf.ipharma.gui.Texts;
import com.bdf.ipharma.model.map.DispenserTipoMap;
import com.bdf.ipharma.model.map.ProductoStockMap;
import com.bdf.ipharma.service.ProductoService;
import com.bdf.ipharma.starter.McdPrs;

public class ProductoModel extends AbstractTableModel implements TableModel{

	private static final long serialVersionUID = 1L;
	private Session session;
	private Component component;
	List<ProductoStockMap> listProductos;
	private static final int DESCRIPTION_COLUMN = 0;
	private static final int STOCK_COLUMN = 1;
	private static final int CANT_A_EXTRAER = 2;
	private static final int EXTRAER_COLUMN = 3;
	private boolean enabled;

	public ProductoModel(Session session,Component component) {
		
		/**Obtenemos los datos del dispenser de Session para traernos la lista de productos de la tabla PRODUCTO_DISPENSER **/
		
		
		DispenserTipoMap parametrosDispenser = (DispenserTipoMap) session.get(Texts.DISPENSER_PROPERTIES);
		ApplicationContext applicationContext = ApplicationContextProvider.getInstance().getApplicationContext();
		ProductoService productoService = (ProductoService) applicationContext.getBean("productoService");
		
		if(session.get(McdPrs.PRODUCTOS_SELECCIONADOS) == null){
			this.setListProductos(productoService.selectAllProductos(String.valueOf(parametrosDispenser.getIdDispenser())));
			session.put(McdPrs.PRODUCTOS_SELECCIONADOS,this.getListProductos());
		}else{
			this.setListProductos((List<ProductoStockMap>)session.get(McdPrs.PRODUCTOS_SELECCIONADOS));
		}

		this.session = session;
		this.component = component;
	}

	public List<ProductoStockMap> getListProductos() {
		return listProductos;
	}

	public void setListProductos(List<ProductoStockMap> listProductos) {
		this.listProductos = listProductos;
	}

	// metodos del AbstractTableModel

	public int getRowCount() {
		return this.getListProductos().size();
	}

	public int getColumnCount() {
		return 4;
	}

	public Object getValueAt(final int rowIndex, int columnIndex) {
		final ProductoStockMap producto = this.getListProductos().get(rowIndex);
		switch (columnIndex) {
		case 0:
			return producto.getDescripcion();
		case 1:
			return producto.getCantidad();
		case 2:
			 return producto.getCantidadAExtraer();
		case 3:

			return producto;
		}

		return null;
	}

	public Class getColumnClass(int columnIndex) {
		return ProductoStockMap.class;

	}

	public String getColumnName(int columnIndex) {
		switch (columnIndex) {
		case DESCRIPTION_COLUMN:
			return "Descripcion";
		case STOCK_COLUMN:
			return "Stock";
		case CANT_A_EXTRAER:
			return "Cantidad a Extraer";	
		case EXTRAER_COLUMN:
			return "Extraer";
		default:
			return null;
		}
	}
	
	public boolean isCellEditable(int arg0, int arg1) { return true; }

}
